javascript

  • JavaScript 几种类型的值, 栈: 原始数据类型( Undefined, Null, Boolean, Number, String) 堆: 引用数据类型(对象, 数组, 函数) 两种类型的区别: 存储的位置不同

//
原始数据类型直接存在栈(stack) 中的简单数据段,占据空间小, 大小固定, 属于被频繁使用的数据,所以放入栈中存储;
引用数据类型存储在堆(heap)中的对象,占据空间大, 大小不固定,如果存储在栈中会影响程序运行性能,在栈中存储了指针, 指向实际的堆中该实体的起始地址。

event loop

1, 原理
事件循环, 关键词是event 事件。 对于JS 程序来说,系统会为其分配两块空间,一块儿是执行栈---供主线程执行同步的程序,一个接一个执行。

另一个是事件队列,用于存放异步事件

callback() 函数,有一个队列,回调函数队列。

事件是通过回调函数实现的, 每一个event都会对应每一个回调函数。
所以说在事件队列里面保存的信息就是回到函数的信息

关键点是 当执行栈空了,就会去事件队列里面去查询可执行的事件, 当有的时间在queue里面得到返回结果以后会通知主线程, 然后主线程会取出queue里面相应的回调函数到执行栈中执行。

因为主线程总是循环不断地去事件队列里面取事件,不断check栈是否空了,因此取名 event loop

打个比方: 如果我加载一个页面,有百亿的element要load,页面很慢。如果我只是用一个主线程栈去运行,那就是同步的,那么在load的过程中,我鼠标点击或者其他的event,页面都无法接受响应,必须瞪大加载完才能继续。实际上,我们用

有一个地方需要注意:
event loop线程一直监听事件队列里的时间,不管执行栈里的程序是否执行完, 当

并不是等执行栈里的程序都执行完,再去监听事件队列。
整个程序执行过程中一直在监听,知道queue为空

setTimeout(fn,5) fn 是回调函数, t是时间
可以将setTimeout看成一个事件, 绑定回调函数,告诉你经过时间t 触发该事件, 将fn调入执行栈末尾等待执行

闭包

  • 理解闭包先要理解 javascript特殊的变量的作用域, 变量作用域无非两种: 全局变量和局部变量

1,javascipt语言的特殊之处, 就在于函数内部可以直接读取全局变量

2, 另一个方面, 在函数外部自然无法读取函数内的局部变量

不用var声明变量,实际上声明了一个全局变量

闭包的存在是为了解决 从外部读取局部变量!

本质上是在函数的内部,再定义一个函数

function f1() {
    var n = 999;
    function f2() {
       alert(n); // 999
    }
}

chain scope, 链式作用域: 父对象的所有变量, 对子对象都是课件,反之则不成立

function f1() {
   var n = 999; // what we want to get from outside
   function f2() {
      alert(n);
   }
   return f2;
}

var result = f1();
result(); // 999

根据上面的代码示例,我们可以知道,闭包实现的精髓在于 返回值是一个内部在子方法,从而利用子方法可以访问父方法的变量,来实现外部访问到局部变量。

代码中f2函数就是所谓的闭包

我的理解,闭包就是能够读取其他函数内部变量的函数, 另一个作用就是让这些变量的值始终保持在内存中
var name = "The Window"

var object = {
    name : "My object",

    getNameFunc: function() {
        return function() {
           return this.name;
        };
    }
};
alert(object.getNameFunc()());

Javascript 面向对象

1, 对象创建、原型链

function MyFunc() {}; // 定义一个空函数

var anObj = new MyFunc(); // 使用new 操作符, 借助MyFun函数, 创建了一个对象
等价于

var anObj = {}; // 创建一个对象
anOjb.__proto__ = MyFunc.prototype;
MyFunc.call(anObj);

“类”的继承

javascript 没有像java那样子类,父类的概念,也没有类 和实例的区分,全靠一种很奇特的原型链(prototype chain)模式,来实现继承

在javacript中,也是用new 来新建一个object
不过 new后面跟的不是类,而是构造函数

function DOG(name) {
    this.name = name;
}

var dogA = new DOG("大毛");
alert(dogA.name); // 大毛
注意构造函数中, this关键字, 它就代表了新创建的实例对象

###prototype 属性的引入

这个属性包含一个对象,prototype对象, 所有实例对象需要共享的属性和方法,都放在这个对象里面;
那些不需要共享的属性和方法,就放在构造函数里面

**关键点: 实例对象一旦创建,将自动引用prototype 对象的属性和方法。 也就是说, 实例对象的属性和方法, 分成两种,一种是本地的, 另一种是引用的**

function DOG(name) {
this.name = name;
}

DOG.prototype = {species : '犬科'};

var dogA = new DOG('one');
var dogB = new DOG('two');

alert(dog.species); // 犬科
alert(dog.species); // 犬科

根据以上实例, species属性放在prototype对象里面, 是两个实例对象共享的。只需要修改了prototype对象,就会同时影响到两个对象

DOG.prototype.species = '猫科';

alert(dogA.species); //猫科
alert(dogB.species); //猫科

Javascript继承机制的设计思想,prototype

Apply 和 call 方法的区别

apply和call的区别

call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,
换句话说 , 就是为了改变函数体内部的this的指向

但是如果我们有一个对象banana= {color : “yellow”} ,我们不想对它重新定义 say 方法,那么我们可以通过 call 或 apply 用 apple 的 say 方法:
所以,可以看出 call 和 apply 是为了动态改变 this 而出现的,当一个 object 没有某个方法(本栗子中banana没有say方法),但是其他的有(本栗子中apple有say方法),我们可以借助call或apply用其它对象的方法来操作。

apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
apply 、 call 、bind 三者都可以利用后续参数传参;
bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。

bind() 的实现,相当于使用函数在内部包了一个 call / apply ,第二次 bind() 相当于再包住第一次 bind() ,故第二次以后的 bind 是无法生效的。

也就是说,区别是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind() 方法。而 apply/call 则会立即执行函数。

  • eval 是做什么的?

它的功能是把对应的字符串解析成JS代码并运行;
应该避免使用eval,因为不安全,非常好性能

  • 什么是document对象? 什么是window对象?

  • null 和 undefined 有何区别

  • Ajax 是什么? 如何创建一个Ajax?

ajax的全称: Asynchronos Javascript And XML

异步传输 + js + xml

所谓异步,在这里简单地解释就是: 向服务器发送请求的时候, 我们不必等待结果, 而是可以同时做其他的事情, 等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验。

1) 创建XMLHttpRequest对象,也就是创建一个异步调用对象
2) 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息
3) 设置响应HTTP请求状态变化的函数
4) 发送HTTP请求
5) 获取异步调用返回的数据
6)使用javascript和DOM实现局部刷新

同步和异步的区别?

事件委托机制 , 事件代理实现对list中每一个li实现监听

1, 事件捕获阶段
事件从文档的根节点出发, 随着DOM树结构向事件的目标节点流去。途中经过各个层次的DOM节点,并在各个节点触发捕获机制,一直传到目标节点, 在冒泡阶段事件会按照这个路径回溯到文档根节点

2, 目标阶段
事件在目标节点上被触发,然后逆向回流,直到传到最外层的文档节点

对于多层嵌套的节点,鼠标和指针事件经常会被定位到最里层的元素上。假设,你在一个div元素上设置了click的监听函数,而用户点击在了这个div元素内部的p元素上,那么p元素就是这个时间的目标元素。事件冒泡让我们可以在这个div或者更上层的元素上监听click事件,并且时间传播过程中触发回调函数。

3,冒泡阶段

事件在目标事件上触发后,并不在这个元素上终止。它会随着DOM树一层层向上冒泡,直到到达最外层的根节点。也就是说,同一事件会一次在目标节点的父节点,父节点的父节点...直到最外层的节点上触发。

window.onload=function(){
  var ulNode=document.getElementById("list");
  ulNode.addEventListener('click',function(e){
       if(e.target&&e.target.nodeName.toUpperCase()=="LI"){/*判断目标事件是否为li*/
         alert(e.target.innerHTML);
       }
     },false);

};

results matching ""

    No results matching ""